#include <config.h>
#include <render.h>
#include <stdlib.h>
#include <file.h>
#include <encoding_manager.h>
#include <fonts_manager.h>
#include <render.h>
#include <string.h>
#include <pthread.h>

/* 放大/缩小系数 */
#define ZOOM_RATIO (0.9)

#define SLIP_MIN_DISTANCE (2*2)


/* 菜单的区域 */
static T_Layout g_atReadingMenuIconsLayout[] = {
	{0, 0, 0, 0, "return.bmp"},
	// {0, 0, 0, 0, "zoomout.bmp"},
	// {0, 0, 0, 0, "zoomin.bmp"},
	{0, 0, 0, 0, "pre_page.bmp"},
    {0, 0, 0, 0, "next_page.bmp"},
    // {0, 0, 0, 0, "continue_mod_small.bmp"},
	{0, 0, 0, 0, NULL},
};

static T_PageLayout g_tReadingPageMenuIconsLayout = {
	.iMaxTotalBytes = 0,
	.atLayout       = g_atReadingMenuIconsLayout,
};

/* 显示设备内容关联在文件中的位置 */
typedef struct PageDesc {
	int iPage;
	unsigned char *pucLcdFirstPosAtFile;
	unsigned char *pucLcdNextPageFirstPosAtFile;
	struct PageDesc *ptPrePage;
	struct PageDesc *ptNextPage;
} T_PageDesc, *PT_PageDesc;

static T_FileMap g_tFileMap;               // 文件句柄数据，在显示过程中文件保持打开
static PT_EncodingOpr g_ptEncodingOprForFile;     // 文件编码

static PT_PageDesc g_ptPages   = NULL;
static PT_PageDesc g_ptCurPage = NULL;

static unsigned char *g_pucLcdFirstPosAtFile;
static unsigned char *g_pucLcdNextPosAtFile;

static T_Layout g_tReadingTextLayout;

// static pthread_t g_tPrepareForwardThreadID;
// static pthread_mutex_t g_tPrepareThreadMutex  = PTHREAD_MUTEX_INITIALIZER;  /* 互斥量 */
// static pthread_cond_t  g_tPrepareConVarPath = PTHREAD_COND_INITIALIZER;     // 条件变量，线程等待预加载路径
// static pthread_cond_t  g_tPrepareConVarData = PTHREAD_COND_INITIALIZER;     // 条件变量，主线程等待预加载完成
// static char g_strPreparePath[256];              // 预加载图片的完整路径
// static T_PixelDatas g_tPreparedPicPixelDatas;   // 预加载图片的像素数据
// static PT_PixelDatas g_ptPreparePixelDatas; 


/**********************************************************************
 * 函数名称： CalcReadingPageMenusLayout
 * 功能描述： 计算页面中各图标座标值
 * 输入参数： 无
 * 输出参数： ptPageLayout - 内含各图标的左上角/右下角座标值
 * 返 回 值： 无
 * 修改日期        版本号     修改人	      修改内容
 * -----------------------------------------------
 * 2013/02/08	     V1.0	  韦东山	      创建
 ***********************************************************************/
static void  CalcReadingPageMenusLayout(PT_PageLayout ptPageLayout)
{
	int iWidth;
	int iHeight;
	int iXres, iYres, iBpp;
	int iTmpTotalBytes;
	PT_Layout atLayout;
	int i;
    int iCount = 0; // 按钮个数 // TODO 扩展所有页面计算Layout

    iCount = sizeof(g_atReadingMenuIconsLayout) / sizeof(g_atReadingMenuIconsLayout[0]) - 1;

	atLayout = ptPageLayout->atLayout;
	GetDispResolution(&iXres, &iYres, &iBpp);
	ptPageLayout->iBpp = iBpp;

	if (iXres < iYres)
	{			 
		/*	 iXres/6
		 *	  --------------------------------------------------------------
		 *	   return	zoomout	zoomin  pre_pic next_pic continue_mod_small
		 *
		 *
		 *
		 *
		 *
		 *
		 *	  --------------------------------------------------------------
		 */
		 
		iWidth  = iXres / iCount;
		iHeight = iWidth;

		/* return图标 */
		atLayout[0].iTopLeftY  = 0;
		atLayout[0].iBotRightY = atLayout[0].iTopLeftY + iHeight - 1;
		atLayout[0].iTopLeftX  = 0;
		atLayout[0].iBotRightX = atLayout[0].iTopLeftX + iWidth - 1;

        /* 其他图标 */
        for (i = 1; i < iCount; i++)
        {
    		atLayout[i].iTopLeftY  = 0;
    		atLayout[i].iBotRightY = atLayout[i].iTopLeftY + iHeight - 1;
    		atLayout[i].iTopLeftX  = atLayout[i-1].iBotRightX + 1;
    		atLayout[i].iBotRightX = atLayout[i].iTopLeftX + iWidth - 1;
        }

	}
	else
	{
		/*	 iYres/6
		 *	  ----------------------------------
		 *	   up		  
		 *
		 *    zoomout	    
		 *
		 *    zoomin
		 *  
		 *    pre_pic
		 *
		 *    next_pic
		 *
		 *    continue_mod_small
		 *
		 *	  ----------------------------------
		 */
		 
		iHeight  = iYres / iCount;
		iWidth = iHeight;

		/* return图标 */
		atLayout[0].iTopLeftY  = 0;
		atLayout[0].iBotRightY = atLayout[0].iTopLeftY + iHeight - 1;
		atLayout[0].iTopLeftX  = 0;
		atLayout[0].iBotRightX = atLayout[0].iTopLeftX + iWidth - 1;
		
        /* 其他5个图标 */
        for (i = 1; i < iCount; i++)
        {
    		atLayout[i].iTopLeftY  = atLayout[i-1].iBotRightY+ 1;
    		atLayout[i].iBotRightY = atLayout[i].iTopLeftY + iHeight - 1;
    		atLayout[i].iTopLeftX  = 0;
    		atLayout[i].iBotRightX = atLayout[i].iTopLeftX + iWidth - 1;
        }		
	}

	i = 0;
	while (atLayout[i].strIconName)
	{
		iTmpTotalBytes = (atLayout[i].iBotRightX - atLayout[i].iTopLeftX + 1) * (atLayout[i].iBotRightY - atLayout[i].iTopLeftY + 1) * iBpp / 8;
		if (ptPageLayout->iMaxTotalBytes < iTmpTotalBytes)
		{
			ptPageLayout->iMaxTotalBytes = iTmpTotalBytes;
		}
		i++;
	}
}


/**********************************************************************
 * 函数名称： CalcReadingPageTextLayout
 * 功能描述： 计算"Reading页面"中"图片的显示区域"
 * 输入参数： 无
 * 输出参数： 无
 * 返 回 值： 无
 * 修改日期        版本号     修改人	      修改内容
 * -----------------------------------------------
 * 2013/02/08	     V1.0	  韦东山	      创建
 ***********************************************************************/
static void CalcReadingPageTextLayout(void)
{
	int iXres, iYres, iBpp;
	int iTopLeftX, iTopLeftY;
	int iBotRightX, iBotRightY;
	
	GetDispResolution(&iXres, &iYres, &iBpp);

	if (iXres < iYres)
	{
		/*	 iXres/6
		 *	  --------------------------------------------------------------
		 *	   return	zoomout	zoomin  pre_pic next_pic continue_mod_small  (图标)
		 *	  --------------------------------------------------------------
		 *
		 *                              图片
		 *
		 *
		 *	  --------------------------------------------------------------
		 */
		iTopLeftX  = 0;
		iBotRightX = iXres - 1;
		iTopLeftY  = g_atReadingMenuIconsLayout[0].iBotRightY + 1;
		iBotRightY = iYres - 1;
	}
	else
	{
		/*	 iYres/6
		 *	  --------------------------------------------------------------
		 *	   up		         |
		 *                       |
		 *    zoomout	         |
		 *                       |
		 *    zoomin             |
		 *                       |
		 *    pre_pic            |                 图片
		 *                       |
		 *    next_pic           |
		 *                       |
		 *    continue_mod_small | 
		 *                       |
		 *	  --------------------------------------------------------------
		 */
		iTopLeftX  = g_atReadingMenuIconsLayout[0].iBotRightX + 1;
		iBotRightX = iXres - 1;
		iTopLeftY  = 0;
		iBotRightY = iYres - 1;
	}

    g_tReadingTextLayout.iTopLeftX   = iTopLeftX;
    g_tReadingTextLayout.iTopLeftY   = iTopLeftY;
    g_tReadingTextLayout.iBotRightX  = iBotRightX;
    g_tReadingTextLayout.iBotRightY  = iBotRightY;
    g_tReadingTextLayout.strIconName = NULL;
}


// 暂时用不上
// static int IncLcdX(int iX)
// {
// 	if (iX + 1 < GetDefaultDispDev()->iXres)
// 		return (iX + 1);
// 	else
// 		return 0;
// }


static int IncLcdY(int iY)
{
    int iFontSize = GetFontSize();
	if (iY + iFontSize < GetDefaultDispDev()->iYres)
		return (iY + iFontSize);
	else
		return 0;
}


static int RelocateFontPos(PT_FontBitMap ptFontBitMap)
{
	int iLcdY;
	int iDeltaX;
	int iDeltaY;

    int iXres, iYres, iBpp;
    GetDispResolution(&iXres, &iYres, &iBpp);

	if (ptFontBitMap->iYMax > iYres)
	{
		/* 满页了 */
		return -1;
	}

	/* 超过LCD最右边 */
	if (ptFontBitMap->iXMax > iXres)
	{
		/* 换行 */		
		iLcdY = IncLcdY(ptFontBitMap->iCurOriginY);
		if (0 == iLcdY)
		{
			/* 满页了 */
			return -1;
		}
		else
		{
			/* 没满页 */
			iDeltaX = g_tReadingTextLayout.iTopLeftX - ptFontBitMap->iCurOriginX;
			iDeltaY = iLcdY - ptFontBitMap->iCurOriginY;

			ptFontBitMap->iCurOriginX  += iDeltaX;
			ptFontBitMap->iCurOriginY  += iDeltaY;

			ptFontBitMap->iNextOriginX += iDeltaX;
			ptFontBitMap->iNextOriginY += iDeltaY;

			ptFontBitMap->iXLeft += iDeltaX;
			ptFontBitMap->iXMax  += iDeltaX;

			ptFontBitMap->iYTop  += iDeltaY;
			ptFontBitMap->iYMax  += iDeltaY;;
			
			return 0;	
		}
	}
	
	return 0;
}


static void RecordPage(PT_PageDesc ptPageNew)
{
	PT_PageDesc ptPage;
		
	if (!g_ptPages)
	{
		g_ptPages = ptPageNew;
	}
	else
	{
		ptPage = g_ptPages;
		while (ptPage->ptNextPage)
		{
			ptPage = ptPage->ptNextPage;
		}
		ptPage->ptNextPage   = ptPageNew;
		ptPageNew->ptPrePage = ptPage;
	}
}


static int ShowOnePage(unsigned char *pucTextFileMemCurPos, PT_VideoMem ptVideoMem)
{
	int iLen;
	int iError;
	unsigned char *pucBufStart;
	unsigned int dwCode;
	PT_FontOpr ptFontOpr;
	T_FontBitMap tFontBitMap;
	
	int bHasNotClrSceen = 1;
	int bHasGetCode = 0;

	tFontBitMap.iCurOriginX = g_tReadingTextLayout.iTopLeftX;	// 文本显示区域最左边起始位置
	tFontBitMap.iCurOriginY = GetFontSize();
	pucBufStart = pucTextFileMemCurPos;

	while (1){
		iLen = GetCodeFrmBuf(pucBufStart, g_tFileMap.pucFileMapMem+g_tFileMap.iFileSize, &dwCode);
		if (0 == iLen)
		{
			/* 文件结束 */
			if (!bHasGetCode){
				return -1;
			}
			else{
				return 0;
			}
		}

		bHasGetCode = 1;
		
		pucBufStart += iLen;

		/* 有些文本, \n\r两个一起才表示回车换行
		 * 碰到这种连续的\n\r, 只处理一次
		 */
		if (dwCode == '\n')
		{
			g_pucLcdNextPosAtFile = pucBufStart;
			
			/* 回车换行 */
			tFontBitMap.iCurOriginX = g_tReadingTextLayout.iTopLeftX;
			tFontBitMap.iCurOriginY = IncLcdY(tFontBitMap.iCurOriginY);
			if (0 == tFontBitMap.iCurOriginY)
			{
				/* 显示完当前一屏了 */
				return 0;
			}
			else
			{
				continue;
			}
		}
		else if (dwCode == '\r')
		{
			continue;
		}
		else if (dwCode == '\t')
		{
			/* TAB键用一个空格代替 */
			dwCode = ' ';
		}
        iError = GetFontBitmap(dwCode, &tFontBitMap);
		if (0 == iError)
		{
			if (RelocateFontPos(&tFontBitMap))
			{
				/* 剩下的LCD空间不能满足显示这个字符 */
				return 0;
			}

			if (bHasNotClrSceen)
			{
				/* 首先清屏 */
	            ClearRectangleInVideoMem(g_tReadingTextLayout.iTopLeftX, g_tReadingTextLayout.iTopLeftY, \
                                        g_tReadingTextLayout.iBotRightX, g_tReadingTextLayout.iBotRightY, \
                                        ptVideoMem, COLOR_BACKGROUND);
				bHasNotClrSceen = 0;
			}
			/* 显示一个字符 */
            if (MergeOneFontToVideoMem(&tFontBitMap, ptVideoMem))
    		{
    			DBG_PRINTF("MergeOneFontToVideoMem error for code 0x%x\n", dwCode);
    			return -1;
    		}
			// 调整下一个字符的位置
			tFontBitMap.iCurOriginX = tFontBitMap.iNextOriginX;
			tFontBitMap.iCurOriginY = tFontBitMap.iNextOriginY;
			g_pucLcdNextPosAtFile = pucBufStart;
		}
		ptFontOpr = ptFontOpr->ptNext;
	}

	return 0;
}


static int ShowNextPage(PT_VideoMem ptVideoMem)
{
	int iError;
	PT_PageDesc ptPage;
	unsigned char *pucTextFileMemCurPos;

	if (g_ptCurPage)
	{
		pucTextFileMemCurPos = g_ptCurPage->pucLcdNextPageFirstPosAtFile;
	}
	else
	{
		pucTextFileMemCurPos = g_pucLcdFirstPosAtFile;
	}
	iError = ShowOnePage(pucTextFileMemCurPos, ptVideoMem);
	if (iError == 0)
	{
		if (g_ptCurPage && g_ptCurPage->ptNextPage)
		{
			g_ptCurPage = g_ptCurPage->ptNextPage;
			return 0;
		}
		
		ptPage = malloc(sizeof(T_PageDesc));
		if (ptPage)
		{
			ptPage->pucLcdFirstPosAtFile         = pucTextFileMemCurPos;
			ptPage->pucLcdNextPageFirstPosAtFile = g_pucLcdNextPosAtFile;
			ptPage->ptPrePage                    = NULL;
			ptPage->ptNextPage                   = NULL;
			g_ptCurPage = ptPage;
			RecordPage(ptPage);
			return 0;
		}
		else
		{
			return -1;
		}
	}
	return iError;
}


static int ShowPrePage(PT_VideoMem ptVideoMem)
{
	int iError;

	if (!g_ptCurPage || !g_ptCurPage->ptPrePage)
	{
		return -1;
	}

	iError = ShowOnePage(g_ptCurPage->ptPrePage->pucLcdFirstPosAtFile, ptVideoMem);
	if (iError == 0)
	{
		g_ptCurPage = g_ptCurPage->ptPrePage;
	}
	return iError;
}


/**********************************************************************
 * 函数名称： ShowTextInReadingPage
 * 功能描述： 在"Reading页面"中显示图片
 * 输入参数： strFileName - 要显示的文件的名字(含绝对路径)
 *            ptVideoMem  - 在这个VideoMem中显示
 * 输出参数： 无
 * 返 回 值： 0      - 成功
 *            其他值 - 失败
 * 修改日期        版本号     修改人	      修改内容
 * -----------------------------------------------
 * 2013/02/08	     V1.0	  韦东山	      创建
 ***********************************************************************/
static int ShowTextInReadingPage(PT_VideoMem ptVideoMem, char *strFileName)
{
    // 参考 ShowOnePage, MergerStringToCenterOfRectangleInVideoMem, MergeOneFontToVideoMem
	int iError;

	strncpy(g_tFileMap.strFileName, strFileName, 256);
	g_tFileMap.strFileName[255] = '\0';
    iError = MapFile(&g_tFileMap);
    if (iError)
    {
        DBG_PRINTF("MapFile %s error!\n", strFileName);
        return 0;
    }

	g_ptEncodingOprForFile = SelectEncodingOprForFile(g_tFileMap.pucFileMapMem);
    if (!g_ptEncodingOprForFile)
    {
        DBG_PRINTF("SelectEncodingOprForFile %s error!\n", strFileName);
        UnMapFile(&g_tFileMap);
        return 0;
    }
    // 第一个显示字符紧接在文件头后面
    g_pucLcdFirstPosAtFile = g_tFileMap.pucFileMapMem + g_ptEncodingOprForFile->iHeadLen;

    // UnMapFile(&g_tFileMap); // 退出时关闭
    
    // 在打开的文件中标记索引位置，在显示设备上逐行逐个显示字符，不同于图片利用PixelDatas一次获取和显示
    // ShowNextPage(ptVideoMem);
	// 自动记录当前的进度，重新打开时恢复
	unsigned char *pucTextFileMemCurPos;

	if (g_ptCurPage)
	{
		pucTextFileMemCurPos = g_ptCurPage->pucLcdFirstPosAtFile;
	}
	else
	{
		pucTextFileMemCurPos = g_pucLcdFirstPosAtFile;
	}
	iError = ShowOnePage(pucTextFileMemCurPos, ptVideoMem);

    return 0;
}


/**********************************************************************
 * 函数名称： ShowReadingPage
 * 功能描述： 显示"Reading页面": 除了显示菜单图标外,还会显示图片
 * 输入参数： ptPageLayout - 内含多个图标的文件名和显示区域
 *            strFileName  - 要显示的图片
 * 输出参数： 无
 * 返 回 值： 无
 * 修改日期        版本号     修改人	      修改内容
 * -----------------------------------------------
 * 2013/02/08	     V1.0	  韦东山	      创建
 ***********************************************************************/
static void ShowReadingPage(PT_PageLayout ptPageLayout, char *strFileName)
{
	PT_VideoMem ptVideoMem;
	int iError;

	PT_Layout atLayout = ptPageLayout->atLayout;
		
	/* 1. 获得显存 */
	ptVideoMem = GetVideoMem(ID("reading"), 1);
	if (ptVideoMem == NULL)
	{
		DBG_PRINTF("can't get video mem for Reading page!\n");
		return;
	}

	/* 2. 描画数据 */

	/* 如果还没有计算过各图标的坐标 */
	if (atLayout[0].iTopLeftX == 0)
	{
		CalcReadingPageMenusLayout(ptPageLayout);
        CalcReadingPageTextLayout();
	}
    /* 在videomem上生成图标 */
	iError = GeneratePage(ptPageLayout, ptVideoMem);

    iError = ShowTextInReadingPage(ptVideoMem, strFileName);
    if (iError)
    {
        PutVideoMem(ptVideoMem);
        return;
    }
    
	/* 3. 刷到设备上去 */
	FlushVideoMemToDev(ptVideoMem);

	/* 4. 解放显存 */
	PutVideoMem(ptVideoMem);

    /* 刷新显示鼠标 */
    int iX, iY;
    GetMousePos(&iX, &iY);
    FreeMouseBox();
    SwitchRegionInDev(iX, iY, GetMouseIconPixelDatas(), GetMouseBox());
}


/**********************************************************************
 * 函数名称： ReadingPageGetInputEvent
 * 功能描述： 为"Reading页面"获得输入数据,判断输入事件位于哪一个图标上
 * 输入参数： ptPageLayout - 内含多个图标的显示区域
 * 输出参数： ptInputEvent - 内含得到的输入数据
 * 返 回 值： -1     - 输入数据不位于任何一个图标之上
 *            其他值 - 输入数据所落在的图标(PageLayout->atLayout数组的哪一项)
 * 修改日期        版本号     修改人	      修改内容
 * -----------------------------------------------
 * 2013/02/08	     V1.0	  韦东山	      创建
 ***********************************************************************/
static int ReadingPageGetInputEvent(PT_PageLayout ptPageLayout, PT_InputEvent ptInputEvent)
{	
	return GenericGetInputEvent(ptPageLayout, ptInputEvent);
}


/**********************************************************************
 * 函数名称： DistanceBetweenTwoPoint
 * 功能描述： 计算两个触点的距离, 为简化计算, 返回距离的平方值
 * 输入参数： ptInputEvent1 - 触点1
              ptInputEvent1 - 触点2
 * 输出参数： 无
 * 返 回 值： 触点距离的平方值
 * 修改日期        版本号     修改人	      修改内容
 * -----------------------------------------------
 * 2013/02/08	     V1.0	  韦东山	      创建
 ***********************************************************************/
static int DistanceBetweenTwoPoint(PT_InputEvent ptInputEvent1, PT_InputEvent ptInputEvent2)
{
    return (ptInputEvent1->iX - ptInputEvent2->iX) * (ptInputEvent1->iX - ptInputEvent2->iX) + \
           (ptInputEvent1->iY - ptInputEvent2->iY) * (ptInputEvent1->iY - ptInputEvent2->iY);
}


/*
static void *PrePareThreadFunction(void *pVoid)
{
    char strFilePath[256];
    T_PixelDatas tOriginPixelDatas;
    int iTextLayoutWidth;
    int iTextLayoutHeight;
    int iError;
    
    while(1){
        // 等待图片上页切换，预加载前一张图片
        pthread_mutex_lock(&g_tPrepareThreadMutex);
        pthread_cond_wait(&g_tPrepareConVarPath, &g_tPrepareThreadMutex);
        strcpy(strFilePath, g_strPreparePath);   // 上一张图片的路径
        // 获得图片文件的原始数据 
        iError = GetPixelDatasFrmFile(strFilePath, &tOriginPixelDatas);
        if (iError){
            g_ptPreparePixelDatas = NULL;
            pthread_mutex_unlock(&g_tPrepareThreadMutex);
            continue;
        }
        // 把图片按比例缩放到LCD屏幕上, 居中显示 
        iTextLayoutWidth  = g_tReadingTextLayout.iBotRightX - g_tReadingTextLayout.iTopLeftX + 1;
        iTextLayoutHeight = g_tReadingTextLayout.iBotRightY - g_tReadingTextLayout.iTopLeftY + 1;

        g_ptPreparePixelDatas = GetZoomedPicPixelDatas(&tOriginPixelDatas, &g_tPreparedPicPixelDatas, iTextLayoutWidth, iTextLayoutHeight);
        FreePixelDatasFrmFile(&tOriginPixelDatas);
        pthread_mutex_unlock(&g_tPrepareThreadMutex);
    }
    return NULL;
}
*/


/**********************************************************************
 * 函数名称： ReadingPageRun
 * 功能描述： "Reading页面"的运行函数: 显示菜单图标,显示图片,根据用户操作作出反应(比如缩放/移动图片等)
 * 输入参数： ptParentPageParams - 内含上一个页面(父页面)的参数
 *                                 ptParentPageParams->iPageID等于ID("main")时,显示"浏览页面";否则显示图片
 * 输出参数： 无
 * 返 回 值： 无
 * 修改日期        版本号     修改人	      修改内容
 * -----------------------------------------------
 * 2013/02/08	     V1.0	  韦东山	      创建
 ***********************************************************************/
static void ReadingPageRun(PT_PageParams ptParentPageParams)
{
	T_InputEvent tInputEvent;
	T_InputEvent tPreInputEvent;
	int bButtonPressed = 0;
	int bPicSlipping = 0;
	int iIndexPressed = -1;
    int iIndex;
    int iError;
    char strFullPathName[256];
    // char strPrevPathName[256];
    PT_VideoMem ptCurVideoMem;

    (void)iError;

    /* 启动线程 */
    // pthread_create(&g_tPrepareForwardThreadID, NULL, PrePareThreadFunction, NULL);

    /* 这两句只是避免编译警告 */
    tPreInputEvent.iX = 0;
    tPreInputEvent.iY = 0;
    
	SetFontSize(28);
    strcpy(strFullPathName, ptParentPageParams->strCurPictureFile); // 实际上是文本文件

    // pthread_mutex_lock(&g_tPrepareThreadMutex);
    // g_ptPreparePixelDatas = NULL;
    // strcpy(g_strPreparePath, strPrevPathName);  // 直接传入上一张的路径
    // pthread_cond_signal(&g_tPrepareConVarPath);
    // pthread_mutex_unlock(&g_tPrepareThreadMutex);
	// TODO 不同文件打开从头处理，同一个文件恢复进度

    /* 显示菜单和文本文件 */
    ShowReadingPage(&g_tReadingPageMenuIconsLayout, strFullPathName);
    
    ptCurVideoMem = GetCurVideoMem();

    while (1)
    {
        /* 先确定是否触摸了菜单图标 */
        iIndex = ReadingPageGetInputEvent(&g_tReadingPageMenuIconsLayout, &tInputEvent);
		
		/* 如果是松开 */
        if (tInputEvent.iPressure == 0)
        {
			bPicSlipping = 0;
			
            if (bButtonPressed)
            {
                /* 曾经有按钮被按下 */
                ReleaseButton(&g_atReadingMenuIconsLayout[iIndexPressed]);
                bButtonPressed = 0;

                if (iIndexPressed == iIndex) /* 按下和松开都是同一个按钮 */
                {
                    SwitchRegionInDev(tInputEvent.iX, tInputEvent.iY, GetMouseIconPixelDatas(), GetMouseBox());
                    switch (iIndexPressed)
                    {
                        case 0: /* 返回按钮 */
                        {
                            // 关闭文件
                            if (g_tFileMap.pucFileMapMem != (unsigned char *)-1)
                                UnMapFile(&g_tFileMap);
                            return;
                        }
                        case 1: /* "上一张"按钮 */
                        {
                            ShowPrePage(ptCurVideoMem);
                            // else {
                            //     /* 算出居中显示时左上角坐标 */
                            //     int iX = (g_tReadingTextLayout.iBotRightX + g_tReadingTextLayout.iTopLeftX - g_ptPreparePixelDatas->iWidth + 1) / 2;
                            //     int iY = (g_tReadingTextLayout.iBotRightY + g_tReadingTextLayout.iTopLeftY - g_ptPreparePixelDatas->iHeight + 1) / 2;
                            //     g_iXofZoomedPicShowInCenter = g_ptPreparePixelDatas->iWidth / 2;
                            //     g_iYofZoomedPicShowInCenter = g_ptPreparePixelDatas->iHeight / 2;
                            //     ClearVideoMemRegion(ptCurVideoMem, &g_tReadingTextLayout, COLOR_BACKGROUND);
                            //     PicMerge(iX, iY, g_ptPreparePixelDatas, &ptCurVideoMem->tPixelDatas);
                            // }
                            FlushVideoMemToDev(ptCurVideoMem);
                            PutVideoMem(ptCurVideoMem);
                            // SwitchRegionInDev(tInputEvent.iX, tInputEvent.iY, GetMouseIconPixelDatas(), GetMouseBox());

                            // 完成显示再预加载，线程预加载时间较长
                            // pthread_mutex_lock(&g_tPrepareThreadMutex);
                            // g_ptPreparePixelDatas = NULL;
                            // strcpy(g_strPreparePath, strPrevPathName);
                            // pthread_cond_signal(&g_tPrepareConVarPath);
                            // pthread_mutex_unlock(&g_tPrepareThreadMutex);

                            break;
                        }
                        case 2: /* "下一张"按钮 */
                        {
                            ShowNextPage(ptCurVideoMem);
                            FlushVideoMemToDev(ptCurVideoMem);
                            PutVideoMem(ptCurVideoMem);
                            SwitchRegionInDev(tInputEvent.iX, tInputEvent.iY, GetMouseIconPixelDatas(), GetMouseBox());
                            
                            // pthread_mutex_lock(&g_tPrepareThreadMutex);
                            // g_ptPreparePixelDatas = NULL;
                            // strcpy(g_strPreparePath, strPrevPathName);
                            // pthread_cond_signal(&g_tPrepareConVarPath);
                            // pthread_mutex_unlock(&g_tPrepareThreadMutex);
                            break;
                        }
                        default:
                        {
                            break;
                        }
                    }
                }
                
                iIndexPressed = -1;
            }
        }
        else if (tInputEvent.iPressure > 0)/* 按下状态 */
        {
            /* 点击的是菜单按钮 */
            if (iIndex != -1)
            {
                if (!bButtonPressed)
                {
                    /* 未曾按下按钮 */
                    bButtonPressed = 1;
                    iIndexPressed = iIndex;
                    PressButton(&g_atReadingMenuIconsLayout[iIndexPressed]);
                    SwitchRegionInDev(tInputEvent.iX, tInputEvent.iY, GetMouseIconPixelDatas(), GetMouseBox());
                }
            }
			else  /* 点击的是图片显示区域, 滑动图片 */
			{
				/* 如果没有按钮被按下 */
				if (!bButtonPressed && !bPicSlipping)
				{
					bPicSlipping = 1;
                    tPreInputEvent = tInputEvent;
				}

				if (bPicSlipping)
				{
                    /* 如果触点滑动距离大于规定值, 则切换上下页 */
                    if (DistanceBetweenTwoPoint(&tInputEvent, &tPreInputEvent) > SLIP_MIN_DISTANCE)
                    {                            
                        // TODO 滑动切换上下页
                        /* 记录滑动点 */
                        tPreInputEvent = tInputEvent;                            
                    }
				}
			}
        }       
    }
}

static T_PageAction g_tReadingPageAction = {
	.name          = "reading",
	.Run           = ReadingPageRun,
};


/**********************************************************************
 * 函数名称： ReadingPageInit
 * 功能描述： 注册"Reading页面"
 * 输入参数： 无
 * 输出参数： 无
 * 返 回 值： 0 - 成功, 其他值 - 失败
 * 修改日期        版本号     修改人	      修改内容
 * -----------------------------------------------
 * 2013/02/08	     V1.0	  韦东山	      创建
 ***********************************************************************/
int ReadingPageInit(void)
{
	return RegisterPageAction(&g_tReadingPageAction);
}

